Linux 下的 I2C 编程
I2C 简介
I2C(Inter Integrated Circuit)总线是 PHILIPS 公司开发的一种半双工、双向二线制同步串行总线。I2C 总线包含两根信号线,双向数据线 SDA,时钟线 SCL)。
它的物理层有如下特点:
- 它是一个支持多设备的总线。“总线”指多个设备共用的信号线。 在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。
- 一个 I2C 总线只使用两条总线线路,一条双向串行数据线 (SDA) ,一条串行时钟线 (SCL)。 数据线即用来表示数据,时钟线用于数据收发同步。
- 每个连接到总线的设备都有一个独立的设备地址,主机可以利用这个地址进行不同设备之间的访问。 其中地址是一个七位或十位的数字。
- 总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲, 都输出高阻态时,由上拉电阻把总线拉成高电平。
- 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
- 具有三种传输模式:标准模式传输速率为 100kbit/s ,快速模式为 400kbit/s , 高速模式下可达 3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模式。
i2c-tools
Linux 系统提供 i2c-tools 工具来对系统中的 I2C 总线进行调试,下面重要介绍 i2c-tools 的使用方法。
安装 i2c-tools
在开发板的 Linux 命令环境中通过下面命令安装:
apt install i2c-tools
i2c-tools 提供i2cdetect
、i2cdump
、i2ctransfer
、 i2cset
、i2cget
命令,来操作 I2C。
i2cdetect
显示所有可用的I2C总线:
i2cdetect -l
i2c-0 i2c Synopsys DesignWare I2C adapter I2C adapter
I2C设备查询:
i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: 50 -- -- -- -- -- -- 57 -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
i2ctransfer
- 写:
i2ctransfer -f -y 0 w3@0x36 0x50 0x81 0x01
- 读:
i2ctransfer -f -y 0 w2@0x36 0x30 0x0A r3
i2cdump
通过 i2cdump 指令可导出 I2C 设备中的所有寄存器内容,例如输入 i2cdump -y 0 0x50,可获得以下内容:
No size specified (using byte-data access)
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: 01 00 0d 00 84 08 e8 03 04 4a 00 00 00 00 00 00 ?.?.?????J......
10: 00 00 35 02 36 39 39 2d 38 32 31 38 30 2d 31 30 ..5?699-82180-10
20: 30 30 2d 34 31 30 20 4a 2e 30 ff ff ff ff ff ff 00-410 J.0......
30: ff ff 35 2d 66 4b 04 00 36 2d 66 4b 04 00 00 00 ..5-fK?.6-fK?...
40: 00 00 00 00 37 2d 66 4b 04 00 30 33 32 33 32 31 ....7-fK?.032321
50: 36 31 33 30 35 36 35 ff ff ff ff ff ff ff ff ff 6130565.........
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
90: ff ff ff ff ff ff 4e 56 43 42 1c 00 4d 31 00 00 ......NVCB?.M1..
a0: 35 2d 66 4b 04 00 36 2d 66 4b 04 00 37 2d 66 4b 5-fK?.6-fK?.7-fK
b0: 04 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ?...............
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 96 ...............?
i2cdump -y 0 0x50指令中,
-y 代表取消用户交互过程,直接执行指令;
0 代表I2C总线编号;
0x50 代表I2C设备从机地址,此处选择配置芯片的高256字节内容。